iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Modern Web

.NET教我做人系列 第 4

Day 4 好的開始從了解基本的(架構、型態)開始

  • 分享至 

  • xImage
  •  

昨天的鐵人賽是不是很輕鬆,但是寫過專案的人一定知道不可能單單印出Hello World~就可以,所以這幾天會來講一些在開發前應該要知道的觀念,像今天就要來介紹C#語言中基本的架構與用法,話不多說就直接開始今天的主題吧~

一開始我們先在終端機打上dotnet new console -o program就會創出跟昨天很類似的資料夾,由於前面的部分我還沒開始說 Webapi 所以用 console 來就可以了,再來我們先來看看這程式碼裡面有甚麼東西

架構介紹

using System;
namespace program;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("hello world");
    }
}

那我們就來一行一行說明好了

using System;
namespace program;

有寫過Python的人應該對import不陌生,在 C# 裡using的用法很相似,他會引用你所指定的命名空間(namespace),所以它跟namespace是不可分離的好友,這裡提醒一下,記得在命名namespace時記得不要拼錯字,不然你會很想殺人~~~

class Program {}

再來是 class,當你定義一個 class 時,就等於定義了一個數據類型的藍圖,換個說法把class想成是一個鍋子,Method、Property、field這些東西就像是你要料理的食材、調味料等等

static void Main(string[] args)
{
    Console.WriteLine("hello world");
}

接下來是這幾個裡面算最重要的地方,我們在執行任何程式時都要有一入口開始執行程式,這裡Main()就扮演了這角色,但在 .NET 較新的版本也開始省略用 Main()但在Program.cs這檔案裡的程式就有如在Main()裡一樣,裡面特別介紹static代表是個靜態物件,void指的是它不會回傳任何值,如果有興趣他們的人可以自己去找看看

資料型別

C# 中有兩種型別:實值型別參考型別

實質型別

實質型別有可分為簡單型別列舉型別結構型別和可為 Null 的實值型別,而且變數的記憶體是存放實際的值。

簡單型別:可以是我們最常見到的int、long、bool、char...,這些都屬於簡單型別

枚舉類型:常見的個是如 enum <enum_name> {enumeration list},記得enumeration list的值只能是數字不能是其他型別

class Program
{
    enum person{
        mon = 1, tue, wed, thu, fri, sat = 10, sun
    }
    static void Main(string[] args)
    {
        int sun = (int) person.sun;
        int mon = (int) person.mon;
        Console.WriteLine("Sun = {0}", sun);
        Console.WriteLine("Sun = {0}", mon);
    }
}

結構型別:它可以說是一個量身訂做的型別,它可以依需求訂到自己要的型態,通常會用到struct來達到目的,這裡我假設要為一個學生訂個型別我就可以寫成

struct student{
    public string name; // 名子
    public int number; // 學號
    public bool sex; // 性別
    public float height; // 身高
    public float weight; // 體重
}

再來我們來使用我們寫好的結構型態

Student S1;
S1.name = "小名";
S1.number = 123;
S1.sex = true;
S1.height = 180.0;
S1.weight = 50;
Console.WriteLine("name = {0}", S1.name);
Console.WriteLine("number = {0}", S1.number);
Console.WriteLine("sex = {0}", S1.sex);
Console.WriteLine("height = {0}", S1.height);
Console.WriteLine("weight = {0}", S1.weight);

最後來看看出來的結果

name = 小名
number = 123
sex = True
height = 180
weight = 50

對了,記得在自訂結構時是不能有參數的要記得,不然一定會出錯!!!

Null 的實值型別:說實話其實我也不是很了解,但大致上應該可以說是「不存在」、「沒有」、「無」或「空」的意思吧~~~

有興趣大家可以看一下個屬性的差別!!!
https://ithelp.ithome.com.tw/upload/images/20220905/20139256FZlJDpNM2q.png

參考型別

參考型別的話也可以分為四種類別型別介面型別陣列型別委派型別,它跟實值型別差別再,它的變數的記憶體空間是存放值記憶體的位置不是存儲值

類別型態:由於類別型態的運用範圍很廣,在使用上常看見的有物件(object)、字串(string)、自訂類別(class name{...})等等,其實還有很多但這不太會是我這次主要討論的點,如果後面有遇到我再來找看看怎麼說

介面型別:定義是所有繼承介面的類別必須遵守的語法合約(聽起來有夠抽象的),簡單說介面負責定義「做什麼」,而類別則負責定義「怎麼做」

這裡就來簡單做個操作

interface IAnimal 
{
  void animalSound(string message);
  void animalSound();
}

class Pig : IAnimal 
{
  public void animalSound(string message) 
  {
    Console.WriteLine(message);
  }
  public void animalSound()
  {
    Console.WriteLine("The pig says: hello!");
  }
}
class Program 
{
  static void Main(string[] args) 
  {
    Pig pig = new Pig();
    pig.animalSound();
    pig.animalSound("The pig says: wee wee");
  }
}

跑完後出來的結果應該會是

The pig says: hello!
The pig says: wee wee

這裡要注意一下,如果 clas s和 interface 裡的method都要被使用到,不然會出現「未實作介面成員」的問題,method裡的參數也要設定對喔!!!

陣列類型:陣列基本上非為單一維度和多維度,寫法也很簡單<元素型別>[陣列常數] 陣列名稱;

int[5] nums = {0, 1, 2, 3, 4};
string[] levels = {"lv1", "lv2", "lv3"};
int[,] nums = {{0, 1, 2}, {3, 4, 5}};

前面這種陣列是有對其的,但又有另一種不規則的寫法。

int[][] numbers = {
    new int[] { 1, 2 },
    new int[] { 3, 4, 5, 6, 7, 8, 9 },
    new int[] { 10,11 }
};

委派型別:Delegate又稱「委派型別」,你可以把它當成用來儲存事件的資料型態,舉例像我們要儲存數值是會運用到int、float等等的元素型別,委派型別就有點像是做這樣的事,下面我簡單來介紹如何使用委派型別吧

委派怎麼寫呢,只需要委派的地方前加上 delegate 即可

private delegate int DelegateTest(int x);

這裡我使用了三種方式來如何使用委派型別,第一種方式是採用指定定義的方法,我們直接對到我們所要指定的方式就行了

static void Main(string[] args)
{
    int i = 1;
    DelegateTest delegateTest = AddOne;
    i = delegateTest(i);
    Console.WriteLine(i); 
}
public static int AddOne(int x)
{
    return ++x;
}

第二種方式,是直接實作的方法,我們直接把我們要做的事寫進delegate

int i = 1;
DelegateTest delegateTest1 = delegate(int x) {
    return x*x;
};
i = delegateTest1(i);
Console.WriteLine(i);

第三種方式就是使用Expression Lambda 的語法來完成

int i = 1;
DelegateTest delegateTest2 = (int x) => {
    return x*10;
};
i = delegateTest2(i);
Console.WriteLine(i);

這三種方法都是可以在不同情況下做使用,另外還有一種是運用到泛型(Generics)的方式我這裡就不多作介紹,有興趣的大家可以自己去找看看

今天光介紹型別這裡我就感覺很多東西都不太清楚,也可以知道我目前的實力還沒那麼厲害,今後我也會努力去增進自己的能力,希望今天可以帶給大家一些幫助,哪麼我們就明天見啦~~~

參考內容:
https://hsuchihting.github.io/c/20200420/951951981/
https://ithelp.ithome.com.tw/articles/10233498
https://adon988.hoohoo.top/blog/c-array-teaching-notes-using-visual-studio/
https://mybaseball52.medium.com/handling-null-in-csharp-60eabafe8e22
http://death0400.blogspot.com/2018/01/c-delegate.html


上一篇
Day 3 再好的武器比不起先有好的環境
下一篇
Day 5 <泛型>到底是甚麼鬼?
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言